#include <iostream>
using namespace std;
#include <pthread.h>
#include <vector>


vector<int> nums({1, 2, 3, 4});
vector<char> chars({'a', 'b', 'c'});

int pos1 = 0;
int pos2 = 0;
int turn = 0; // 0 打印数组，1 打印字符

pthread_cond_t cond;
pthread_mutex_t mutex;

void* print_nums(void* args) 
{
    while (1) 
    {
        pthread_mutex_lock(&mutex);
        while (turn) {
            pthread_cond_wait(&cond, &mutex);
        }

        // 边界情况
        if (pos1 == nums.size()) {
            turn = 1;

            pthread_cond_signal(&cond);
            pthread_mutex_unlock(&mutex);
            break;
        }

        cout << nums[pos1++];
        turn = 1;

        pthread_cond_signal(&cond);
        pthread_mutex_unlock(&mutex);
    }

    return NULL;
}

void* print_chars(void* args) 
{
    while (1) 
    {
        pthread_mutex_lock(&mutex);
        while (!turn) {
            pthread_cond_wait(&cond, &mutex);
        }

        // 边界情况
        if (pos2 == chars.size()) {
            turn = 0;

            pthread_cond_signal(&cond);
            pthread_mutex_unlock(&mutex);
            break;
        }

        cout << chars[pos2++];
        turn = 0;

        pthread_cond_signal(&cond);
        pthread_mutex_unlock(&mutex);
    }

    return NULL;
}

int main() 
{
    pthread_t ts[2];

    // 初始化
    pthread_mutex_init(&mutex, NULL);
    pthread_cond_init(&cond, NULL);

    // 创建线程
    pthread_create(&ts[0], NULL, print_nums, NULL);
    pthread_create(&ts[1], NULL, print_chars, NULL);

    // 销毁线程
    pthread_join(ts[0], NULL);
    pthread_join(ts[1], NULL);

    cout << endl;

    pthread_mutex_destroy(&mutex);
    pthread_cond_destroy(&cond);

    return 0;
}

// vector<int> nums({1, 2, 3, 4});
// vector<char> chars({'a', 'b', 'c'});

// int pos1 = 0;
// int pos2 = 0;

// pthread_mutex_t mutex;
// pthread_cond_t cond;

// void* print(void* args) 
// {
//     int* arg = (int*)args;
//     int flag = *arg;
//     delete arg;

//     pthread_detach(pthread_self());

//     while (1) {
//         if (flag == 0) {
//             pthread_mutex_lock(&mutex); // 申请锁
            
//             // 边界情况
//             if (pos1 == nums.size()) {
//                 pthread_cond_signal(&cond); // 唤醒条件变量下等待的线程
//                 pthread_mutex_unlock(&mutex); // 释放锁
//                 break;
//             }

//             cout << nums[pos1++];

//             pthread_cond_signal(&cond);
//             pthread_cond_wait(&cond, &mutex);
//         }
//         else {
//             pthread_mutex_lock(&mutex);

//             if (pos2 == chars.size()) {
//                 pthread_cond_signal(&cond);
//                 pthread_mutex_unlock(&mutex);
//                 break;
//             }

//             cout << chars[pos2++];

//             pthread_cond_signal(&cond);
//             pthread_cond_wait(&cond, &mutex);
//         }
//     }

//     return NULL;
// }

// int main() 
// {
//     pthread_t threads[2];

//     pthread_mutex_init(&mutex, NULL);
//     pthread_cond_init(&cond, NULL);

//     for (int i = 0; i < 2; i++) {
//         int* flag = new int(i);
//         pthread_create(&threads[i], NULL, print, flag);
//     }

//     while (!(pos1 == nums.size() && pos2 == chars.size())) {}

//     pthread_mutex_destroy(&mutex);
//     pthread_cond_destroy(&cond);

//     return 0;
// }